<?php
namespace Classes;

class Field {    
    const TEXT = 1;
    const HIDDEN = 2;
    const TEXTAREA = 3;
    const SELECT = 4;
    const DATE = 5;
    const DATEHIDDEN = 6;
    const RADIO = 7;
    const CHECKBOX = 8;
    const EMAIL = 9;
    const PASSWORD = 10;
    const NUMBER = 11;
    const URL = 12;
    const IMAGE = 13;
    const FILE = 14;
    
    /**
     * Retourne les types de champs disponibles en tant qu'options d'un select
     * @param type $value : Cette valeur sera séléctionnée si elle est fournie
     * @return string $output
     */
    public function getFieldTypes($value=null) {
        $output = '<option value="'.Field::TEXT.'"'.(($value==Field::TEXT)?' selected="selected"':'').'>TEXT</option>'
                . '<option value="'.Field::HIDDEN.'"'.(($value==Field::HIDDEN)?' selected="selected"':'').'>HIDDEN</option>'
                . '<option value="'.Field::TEXTAREA.'"'.(($value==Field::TEXTAREA)?' selected="selected"':'').'>TEXTAREA</option>'
                . '<option value="'.Field::SELECT.'"'.(($value==Field::SELECT)?' selected="selected"':'').'>SELECT</option>'
                . '<option value="'.Field::DATE.'"'.(($value==Field::DATE)?' selected="selected"':'').'>DATE</option>'
                . '<option value="'.Field::DATEHIDDEN.'"'.(($value==Field::DATEHIDDEN)?' selected="selected"':'').'>DATE HIDDEN</option>'
                . '<option value="'.Field::RADIO.'"'.(($value==Field::RADIO)?' selected="selected"':'').'>RADIO BOUTON</option>'
                . '<option value="'.Field::CHECKBOX.'"'.(($value==Field::CHECKBOX)?' selected="selected"':'').'>CHECKBOX</option>'
                . '<option value="'.Field::EMAIL.'"'.(($value==Field::EMAIL)?' selected="selected"':'').'>EMAIL</option>'
                . '<option value="'.Field::PASSWORD.'"'.(($value==Field::PASSWORD)?' selected="selected"':'').'>PASSWORD</option>'
                . '<option value="'.Field::NUMBER.'"'.(($value==Field::NUMBER)?' selected="selected"':'').'>NUMBER</option>'
                . '<option value="'.Field::URL.'"'.(($value==Field::URL)?' selected="selected"':'').'>URL</option>'
                . '<option value="'.Field::IMAGE.'"'.(($value==Field::IMAGE)?' selected="selected"':'').'>IMAGE</option>'
                . '<option value="'.Field::FILE.'"'.(($value==Field::FILE)?' selected="selected"':'').'>FILE</option>';
        return $output;
    }
    
    /**
     * Retourne la liste des valeurs par défaut pour un champ
     * @param type $value : Cette valeur sera séléctionnée si elle est fournie
     * @return string $output
     */
    public function getFieldDefaultValues($value='') {
        $output = '<option value="">-- Aucun --</option>'
                . '<option value="now"'.(($value=='now')?' selected="selected"':'').'>Date du jour</option>';
        return $output;
    }
    
    /**
     * Retourne la liste des valeurs assignées pour un champ
     * @param type $value : Cette valeur sera séléctionnée si elle est fournie
     * @return string $output
     */
    public function getFieldAffectedValues($value='') {
        $output = '<option value="">-- Aucun --</option>'
                . '<option value="now"'.(($value=='now')?' selected="selected"':'').'>Date du jour</option>';
        return $output;
    }
    
    /**
     * Retourne la date du jour comme valeur par défaut ou comme valeur assignée
     * @return string
     */
    public function now() {
        return date('Y-m-d');
    }
    
    /**
     * Retourne l'affichage html d'un champ
     * @param string $type : Type du champ
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $pOption : Options prédéfinies si existent
     * @param type $pValue : Valeurs prédéfines si existent
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $html
     */
    public function getHTML($type, $alias, $class, $pOption, $pValue, $value, $required) {
        switch ($type) {
            case Field::TEXT:
                $html = $this->textHTML($alias, $class, $value, $required);
                break;
            case Field::HIDDEN:
                $html = $this->hiddenHTML($alias, $class, $value, $required);
                break;
            case Field::TEXTAREA:
                $html = $this->textareaHTML($alias, $class, $value, $required);
                break;
            case Field::SELECT:
                $html = $this->selectHTML($alias, $class, $pOption, $pValue, $value, $required);
                break;
            case Field::DATE:
                $html = $this->dateHTML($alias, $class, $value, $required);
                break;
            case Field::DATEHIDDEN:
                $html = $this->datehiddenHTML($alias, $class, $value, $required);
                break;
            case Field::RADIO:
                $html = $this->radioHTML($alias, $class, $pOption, $pValue, $value, $required);
                break;
            case Field::CHECKBOX:
                $html = $this->checkboxHTML($alias, $class, $pOption, $pValue, $value, $required);
                break;
            case Field::EMAIL:
                $html = $this->emailHTML($alias, $class, $value, $required);
                break;
            case Field::PASSWORD:
                $html = $this->passwordHTML($alias, $class, $value, $required);
                break;
            case Field::NUMBER:
                $html = $this->numberHTML($alias, $class, $value, $required);
                break;
            case Field::URL:
                $html = $this->urlHTML($alias, $class, $value, $required);
                break;
            case Field::IMAGE:
                $html = $this->imageHTML($alias, $class, $value, $required);
                break;
            case Field::FILE:
                $html = $this->fileHTML($alias, $class, $value, $required);
                break;
            default :
                $html = $this->textHTML($alias, $class, $value, $required);
        }
        return $html;
    }
    
    /**
     * Retourne un champ text
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function textHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="text" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ hidden
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function hiddenHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="hidden" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ textarea
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function textareaHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<textarea  id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" '.$required.'>'.$value.'</textarea>';
        return $output;
    }
    
    /**
     * Retourne un champ select
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $pOption : Options prédéfinies si existent
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function selectHTML($alias, $class, $pOption, $pValue, $value, $required) {
        $required = ($required)?'required':'';
        $tabOption = explode(',', $pOption);
        $tabValue = explode(',', $pValue);
        $output = '<select id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" '.$required.'>';
        foreach($tabOption as $idx => $option) {
            $selected = ($tabValue[$idx] == $value)?' selected="selected"':'';
            $output .= '<option value="'.$tabValue[$idx].'"'.$selected.'>'.$option.'</option>';
        }
        $output .= '</select>';
        return $output;
    }
    
    /**
     * Retourne un champ date
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function dateHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="text" id="'.$alias.'" name="attrData['.$alias.']" class="datepicker '.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ date caché
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function datehiddenHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="hidden" id="'.$alias.'" name="attrData['.$alias.']" class="datepicker '.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ radio
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $pOption : Options prédéfinies si existent
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function radioHTML($alias, $class, $pOption, $pValue, $value) {
        $tabOption = explode(',', $pOption);
        $tabValue = explode(',', $pValue);
        $selected0 = ($tabValue[0] == $value)?' checked="checked"':'';
        $selected1 = ($tabValue[1] == $value)?' checked="checked"':'';
        $output = '';
        $output .= '<p>'
                . '<label>'
                . '<input type="radio" id="'.$alias.'_'.$tabValue[0].'" name="attrData['.$alias.']" class="'.$class.'" value="'.$tabValue[0].'" '.$selected0.' />&nbsp;'.$tabOption[0]
                . '</label>&nbsp;&nbsp;&nbsp;'
                . '<label>'
                . '<input type="radio" id="'.$alias.'_'.$tabValue[1].'" name="attrData['.$alias.']" class="'.$class.'" value="'.$tabValue[1].'" '.$selected1.' />&nbsp;'.$tabOption[1]
                . '</label>'
                . '</p>';
        return $output;
    }
    
    /**
     * Retourne un champ checkbox
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $pOption : Options prédéfinies si existent
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function checkboxHTML($alias, $class, $pOption, $pValue, $value) {
        $output = '';
        $tabOption = explode(',', $pOption);
        $tabValue = explode(',', $pValue);
        $values = explode(',', $value);
        foreach($tabOption as $idx => $option) {
            $checked = (in_array($tabValue[$idx], $values))?' checked="checked"':'';
            $output .= '<p>'
                    . '<label>'
                    . '<input type="checkbox" id="'.$alias.'_'.$tabValue[$idx].'" name="attrData['.$alias.'][]" class="'.$class.'" value="'.$tabValue[$idx].'" '.$checked.' /> '.$option
                    . '</label>'
                    . '</p>';
        }
        return $output;
    }
    
    /**
     * Retourne un champ email
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function emailHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="email" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ password
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function passwordHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="password" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ number
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function numberHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="text" id="'.$alias.'" name="attrData['.$alias.']" class="numeric '.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ url
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    private function urlHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '<input type="url" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" value="'.$value.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ image
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    public function imageHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '';        
        if($value) {
            $output .= '<span id="del-'.$alias.'" class="delete-image" title="Supprimer l\'image" onclick="deleteFile(this, \''.$value.'\', \'Voulez vous supprimer cette image?\')"></span>';
        }
        $output .= '<input type="file" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" '.$required.' />';
        return $output;
    }
    
    /**
     * Retourne un champ file
     * @param string $alias : Id et nom du champ
     * @param string $class : Class css du champ
     * @param type $value : Valeur du champ
     * @param int $required : Si le champ est obligatoire
     * @return string $output
     */
    public function fileHTML($alias, $class, $value, $required) {
        $required = ($required)?'required':'';
        $output = '';
        if($value) {
            $output .= '<span id="del-'.$alias.'" class="delete-file" title="Supprimer le fichier" onclick="deleteFile(this, \''.$value.'\', \'Voulez vous supprimer ce fichier?\')"></span>';
        }
        $output .= '<input type="file" id="'.$alias.'" name="attrData['.$alias.']" class="'.$class.'" '.$required.' />';        
        return $output;
    }
}

